From 8ecda208694048a6926ec1f05ffc1a13e6c66a5d Mon Sep 17 00:00:00 2001 From: "iap10@freefall.cl.cam.ac.uk" Date: Thu, 8 Sep 2005 17:35:44 +0000 Subject: [PATCH] Fixes to sub 4GB allocator Signed-off-by: ian@xensource.com --- xen/common/memory.c | 3 ++- xen/include/asm-x86/page.h | 13 ++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/xen/common/memory.c b/xen/common/memory.c index a744272539..45e9cc6852 100644 --- a/xen/common/memory.c +++ b/xen/common/memory.c @@ -154,7 +154,8 @@ long do_memory_op(int cmd, void *arg) reservation.nr_extents -= start_extent; if ( (reservation.address_bits != 0) && - (reservation.address_bits < (get_order(max_page) + PAGE_SHIFT)) ) + (reservation.address_bits < + (get_order_from_pages(max_page) + PAGE_SHIFT)) ) { if ( reservation.address_bits < 31 ) return -ENOMEM; diff --git a/xen/include/asm-x86/page.h b/xen/include/asm-x86/page.h index 71edad1530..2473b8cbf3 100644 --- a/xen/include/asm-x86/page.h +++ b/xen/include/asm-x86/page.h @@ -280,7 +280,7 @@ extern void paging_init(void); #ifndef __ASSEMBLY__ -static __inline__ int get_order(unsigned long size) +static inline int get_order_from_bytes(physaddr_t size) { int order; size = (size-1) >> PAGE_SHIFT; @@ -289,6 +289,17 @@ static __inline__ int get_order(unsigned long size) return order; } +static inline int get_order_from_pages(unsigned long nr_pages) +{ + int order; + nr_pages--; + for ( order = 0; nr_pages; order++ ) + nr_pages >>= 1; + return order; +} + +#define get_order(s) get_order_from_bytes(s) + /* Allocator functions for Xen pagetables. */ struct pfn_info *alloc_xen_pagetable(void); void free_xen_pagetable(struct pfn_info *pg); -- 2.30.2